<?php
function RegistroHeader($boleto){
    $linha  = numero("104",3); // Código do Banco na Compensação: “104”
    $linha .= numero("0000",4); // Lote de Serviço: "0000"
    $linha .= numero("0",1); // Tipo de Registro: "0"
    $linha .= alfa("",9); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $linha .= numero("2",1); // Tipo de Inscrição da Empresa
    $linha .= numero(limpaCPF(CNPJInstituicao($boleto->get_id_instituicao())),14); // Número de Inscrição da Empresa
    $linha .= numero("0",20); // Uso Exclusivo CAIXA: "0"
    $linha .= numero($boleto->get_agencia(),5); // Agência Mantenedora da Conta
    $linha .= alfa($boleto->get_agencia_dv(),1); // Dígito Verificador da Agência
    $linha .= numero($boleto->get_convenio(),6); // Código do Convênio no Banco
    $linha .= numero("0",7); // Uso Exclusivo CAIXA: "0"
    $linha .= numero("0",1); // Uso Exclusivo CAIXA: "0"
    $linha .= alfa(nomeInstituicao($boleto->get_id_instituicao()),30); // Nome da Empresa
    $linha .= alfa("CAIXA ECONOMICA FEDERAL",30); // Nome do Banco
    $linha .= alfa("",10); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $linha .= numero("1",1); // Código Remessa / Retorno
    $linha .= numero(date("dmY"),8); // Data de Geração do Arquivo
    $linha .= numero(date("His"),6); // Hora de Geração do Arquivo
    $linha .= numero(GetMaxId(),6); // Sequencial da Remessa 
    $linha .= numero("050",3); // N o da Versão do Layout do Arquivo
    $linha .= numero("0",5); // Densidade de Gravação do Arquivo
    $linha .= alfa("",20); // Para Uso Reservado do Banco
    $linha .= alfa("",20); // Para Uso Reservado da Empresa
    $linha .= alfa("",4); // Versão Aplicativo CAIXA
    $linha .= alfa("",25); // CUso Exclusivo FEBRABAN / CNAB: “Brancos”
    $_SESSION["sequencial"]++;
    
    $linha .= "\n".RegistroHeaderLote($boleto);
    
    return $linha;
}

function RegistroHeaderLote($boleto){
    $_SESSION["sequencial_registro_lote"] = 1;
    $_SESSION["sequencial_lote"]++;
    
    $linha  = numero("104",3); // Código do Banco na Compensação: “104”
    $linha .= numero($_SESSION["sequencial_lote"],4); // Lote de Serviço
    $linha .= numero("1",1); // Tipo de Registro: "1"
    $linha .= alfa("R",1); // Tipo de Operação
    $linha .= numero("01",2); // Tipo de Serviço
    $linha .= numero("00",2); // CUso Exclusivo FEBRABAN / CNAB: “00”
    $linha .= numero("030",3); // No da Versão do Layout do Lote
    $linha .= alfa("",1); // CUso Exclusivo FEBRABAN / CNAB: “Brancos”
    $linha .= numero("2",1); // Tipo de Inscrição da Empresa
    $linha .= numero(limpaCPF(CNPJInstituicao($boleto->get_id_instituicao())),15); // No de Inscrição da Empresa
    $linha .= numero($boleto->get_convenio(),6); // Código do Cedente no Banco
    $linha .= numero("0",14); // Uso Exclusivo CAIXA
    $linha .= numero($boleto->get_agencia(),5); // Agência Mantenedora da Conta
    $linha .= alfa($boleto->get_agencia_dv(),1); // Dígito Verificador da Agência
    $linha .= numero($boleto->get_convenio(),6); // Código do Convênio no Banco
    $linha .= numero("0",7); // Código do Modelo Personalizado
    $linha .= numero("0",1); // Uso Exclusivo CAIXA
    $linha .= alfa(nomeInstituicao($boleto->get_id_instituicao()),30); // Nome da Empresa
    
    $linha .= alfa("",40); // Mensagem 1
    $linha .= alfa("",40); // Mensagem 2
    $linha .= numero(GetMaxId(),8); // Número Remessa/Retorno
    $linha .= numero(date("dmY"),8); // Data de Gravação Remessa/Retorno
    $linha .= numero("0",8); // Data do Crédito
    $linha .= alfa("",33); // CUso Exclusivo FEBRABAN / CNAB: “Brancos”
    
    return $linha;
}

function RegistroDetalhe($boleto, $transacao){
    $detalhe  = numero("104",3); // Código do Banco na Compensação: “104”
    $detalhe .= numero($_SESSION["sequencial_lote"],4); // Lote de Serviço
    $detalhe .= numero("3",1); // Tipo de Registro: "3"
    $detalhe .= numero($_SESSION["sequencial_registro_lote"],5); // No Sequencial do Registro no Lote
    $detalhe .= alfa("P",1); // Cód. Segmento do Registro Detalhe
    $detalhe .= alfa("",1); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $detalhe .= numero("01",2); // Código de Movimento Remessa
    $detalhe .= numero($boleto->get_agencia(),5); // Agência Mantenedora da Conta
    $detalhe .= alfa($boleto->get_agencia_dv(),1); // Dígito Verificador da Agência
    $detalhe .= numero($boleto->get_convenio(),6); // Código do Convênio no Banco
    $detalhe .= numero("0",8); // Uso Exclusivo da CAIXA
    $detalhe .= numero("0",3); // Uso Exclusivo da CAIXA
    $detalhe .= numero("14",2); // Modalidade da Carteira
    $detalhe .= numero($transacao["id"],15); // Identificação do Título no Banco
    $detalhe .= numero("1",1); // Código da Carteira
    $detalhe .= numero("1",1); // Forma de Cadastr. do Título no Banco
    $detalhe .= alfa("2",1); // Tipo de Documento
    $detalhe .= numero("2",1); // Identificação da Emissão do Bloqueto
    $detalhe .= alfa("2",1); // Identificação da Emissão do Bloqueto
    $detalhe .= alfa($transacao["id"],11); // Número do Documento de Cobrança
    $detalhe .= alfa("",4); // Uso Exclusivo CAIXA
    $detalhe .= numero(data($transacao["data_vencimento"]),8); // Data de Vencimento do Título
    $detalhe .= num_real($transacao["valor_documento"], (13 + 2)); // Valor Nominal do Título
    $detalhe .= numero("0",5); // Agência Encarregada da Cobrança
    $detalhe .= alfa("0",1); // Dígito Verificador da Agência
    $detalhe .= numero("02",2); // Espécie do Título
    $detalhe .= alfa("N",1); // Identific. de Título Aceito/Não Aceito
    $detalhe .= numero(data($transacao["data_emissão"]),8); // Data da Emissão do Título
    $detalhe .= numero("3",1); // Código do Juros de Mora
    $detalhe .= numero("0",8); // Data do Juros de Mora
    $detalhe .= num_real("0000000000000", (13 + 2)); // Juros de Mora por Dia/Taxa
    $detalhe .= numero("0",1); // Código do Desconto 1
    $detalhe .= numero("00000000",8); // Data do Desconto 1
    $detalhe .= num_real("0000000000000", (13 + 2)); // Valor/Percentual a ser Concedido
    $detalhe .= num_real("0000000000000", (13 + 2)); // Valor do IOF a ser Recolhido
    $detalhe .= num_real("0000000000000", (13 + 2)); // Valor do Abatimento
    $detalhe .= alfa($transacao["id"],25); // Identificação do Título na Empresa
    $detalhe .= numero("3",1); // Código para Protesto
    $detalhe .= numero("0",2); // Número de Dias para Protesto
    $detalhe .= numero("0",1); // Código para Baixa/Devolução
    $detalhe .= alfa("",3); // Número de Dias para Baixa/Devolução
    $detalhe .= numero("09",2); // Código da Moeda
    $detalhe .= numero("0",10); // Uso Exclusivo CAIXA
    $detalhe .= alfa("",1); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    
    $_SESSION["sequencial"]++;
    $_SESSION["sequencial_registro_lote"]++;
    $_SESSION["valor_registro_lote"] += $transacao["valor_documento"];
    
    $detalhe .= "\n".RegistroDetalhe_Q($boleto, $transacao);
    
    return $detalhe;
}

function RegistroDetalhe_Q($boleto, $transacao){
    $sacado = new inscrito();
    $sacado->carregar($transacao["cpf"]);
    
    $cedente = new instituicao();
    $cedente->carregar($boleto->get_id_instituicao());
    
    $detalhe  = numero("104",3); // Código do Banco na Compensação: “104”
    $detalhe .= numero($_SESSION["sequencial_lote"],4); // Lote de Serviço
    $detalhe .= numero("3",1); // Tipo de Registro: "3"
    $detalhe .= numero($_SESSION["sequencial_registro_lote"],5); // No Sequencial do Registro no Lote
    $detalhe .= alfa("Q",1); // Cód. Segmento do Registro Detalhe
    $detalhe .= alfa("",1); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $detalhe .= numero("01",2); // Código de Movimento Remessa
    $detalhe .= numero("1",1); // Tipo de Inscrição
    $detalhe .= numero(limpaCPF($sacado->get_cpf()),15); // Número de Inscrição
    $detalhe .= alfa($sacado->get_nome(),40); // Nome
    $detalhe .= alfa($sacado->get_endereco()." ".$sacado->get_numero(),40); // Endereço
    $detalhe .= alfa($sacado->get_bairro(),15); // Bairro
    $detalhe .= numero(substr($sacado->get_cep(), 0, 5),5); // CEP
    $detalhe .= numero(substr($sacado->get_cep(), 6),3); // Sufixo do CEP
    $detalhe .= alfa($sacado->get_cidade(),15); // Cidade
    $detalhe .= alfa($sacado->get_uf(),2); // Unidade da Federação
    
    $detalhe .= numero("2",1); // Tipo de Inscrição
    $detalhe .= numero(limpaCPF($cedente->get_cnpj()),15); // Tipo de Inscrição
    $detalhe .= alfa($cedente->get_nome(),40); // Nome do Sacador/Avalista
    $detalhe .= numero("000",3); // Cód. Bco. Corresp. na Compensação
    $detalhe .= alfa("",20); // Nosso No no Banco Correspondente
    $detalhe .= alfa("",8); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    
    $_SESSION["sequencial"]++;
    $_SESSION["sequencial_registro_lote"]++;
    
    unset($sacado);
    unset($cedente);
    
    return $detalhe;
}

function RegistroTrailerLote(){
    $trailler  = numero("104",3); // Código do Banco na Compensação: “104”
    $trailler .= numero($_SESSION["sequencial_lote"],4); // Lote de Serviço
    $trailler .= numero("5",1); // Tipo de Registro: "S"
    $trailler .= alfa("",9); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $trailler .= numero($_SESSION["sequencial_registro_lote"],6); // Quantidade de Registros no Lote
    $trailler .= numero($_SESSION["sequencial_registro_lote"],6); // Quantidade de Títulos em Cobrança
    $trailler .= num_real($_SESSION["valor_registro_lote"],(15 + 2)); // Valor Total dosTítulos em Carteiras
    $trailler .= numero("0",6); // Quantidade de Títulos em Cobrança
    $trailler .= num_real("0",(15 + 2)); // Valor Total dosTítulos em Carteiras
    $trailler .= numero("0",6); // Quantidade de Títulos em Cobrança
    $trailler .= num_real("0",(15 + 2)); // Valor Total dosTítulos em Carteiras
    
    $trailler .= alfa("",31); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $trailler .= alfa("",117); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    
    return $trailler;
}

function RegistroTrailler(){
    $trailler = RegistroTrailerLote()."\n";
    
    $trailler .= numero("104",3); // Código do Banco na Compensação: “104”
    $trailler .= numero("9999",4); // Lote de Serviço: "9999"
    $trailler .= numero("9",1); // Tipo de Registro: "9"
    $trailler .= alfa("",9); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    
    $trailler .= numero($_SESSION["sequencial_lote"],6); // Quantidade de Lotes do Arquivo
    $trailler .= numero($_SESSION["sequencial"],6); // Quantidade de Registros do Arquivo
    
    $trailler .= alfa("",6); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $trailler .= alfa("",205); // Uso Exclusivo FEBRABAN / CNAB: “Brancos”
    $_SESSION["sequencial"]++;
    
    return $trailler;
}
